# 导入 NumPy 库，用于数值计算
import numpy as np
# 从 matplotlib 库中导入 pyplot 模块，用于绘图
from matplotlib import pyplot as plt

# 定义向量 A
A = np.array([[5],[4]])
# 定义向量 C
C = np.array([[4],[6]])
# 计算 A 的转置与 C 的点积
B = A.T.dot(C)
# 计算 A 的转置与 A 的点积的逆矩阵
AA = np.linalg.inv(A.T.dot(A))
# 计算投影系数
l = AA.dot(B)
# 计算向量 C 在向量 A 上的投影向量 P
P = A.dot(l)
# 生成一个在 -2 到 2 之间均匀分布的 10 个点的数组
x = np.linspace(-2,2,10)
# 调整 x 的形状为 (1, 10)
x.shape = (1,10)
# 计算 A 与 x 的乘积
xx = A.dot(x)
# 创建一个新的图形对象
fig = plt.figure()
# 在图形中添加一个子图
ax = fig.add_subplot(111)
# 绘制 xx 的第一个维度和第二个维度的数据
ax.plot(xx[0,:],xx[1,:])
# 在图上绘制向量 A 的端点，用黑色圆点表示
ax.plot(A[0],A[1],'ko')
# 绘制从向量 C 到投影向量 P 的线段，用红色带圆点的线表示
ax.plot([C[0],P[0]],[C[1],P[1]],'r-o')
# 绘制从投影向量 P 到向量 C 的线段，用品红色带圆点的线表示
ax.plot([P[0],C[0]],[P[1],C[1]],'m-o')

# 添加原点到 C 的连线
# 修改为提取 C 中的标量值
ax.plot([0, C[0, 0]], [0, C[1, 0]], 'b-o')

# 绘制垂直于 x 轴的黑色直线，x = 0
ax.axvline(x=0,color='black')
# 绘制平行于 x 轴的黑色直线，y = 0
ax.axhline(y=0,color='black')
# 定义文本标注的边距
margin = 0.1
# 在向量 A 的端点附近添加文本标注 "A"
ax.text(A[0]+margin, A[1]+margin, r"A",fontsize=20)
# 在向量 C 的端点附近添加文本标注 "C"
ax.text(C[0]+margin, C[1]+margin, r"C",fontsize=20)
# 在投影向量 P 的端点附近添加文本标注 "P"
ax.text(P[0]+margin, P[1]+margin, r"P",fontsize=20)
# 在原点附近添加文本标注 "O"
ax.text(0+margin,0+margin,r"O",fontsize=20)
# 在 y 轴上添加文本标注 "y"
ax.text(0+margin,4+margin, r"y",fontsize=20)
# 在 x 轴上添加文本标注 "x"
ax.text(4+margin,0+margin, r"x",fontsize=20)
# 设置 x 轴的刻度为从 -2 到 2 的整数
plt.xticks(np.arange(-2,3))
# 设置 y 轴的刻度为从 -2 到 2 的整数
plt.yticks(np.arange(-2,3))
# 设置坐标轴的比例相等
ax.axis('equal')
# 显示绘制的图形
plt.show()
